home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 1
/
Cream of the Crop 1.iso
/
PROGRAM
/
DDJ9205.ARJ
/
CHECKSUM.ASC
< prev
next >
Wrap
Text File
|
1992-03-30
|
3KB
|
113 lines
_FLETCHER'S CHECKSUM_
by John Kodis
Example 1:
(a)
integer i, sum1, sum2;
sum1 = 0;
sum2 = 0;
for i from 1 to message_length do
sum1 = ( sum1 + message[i] ) modulo 255;
sum2 = ( sum2 + sum1 ) modulo 255;
end for.
(b)
check1 = 255 - (( sum1 + sum2 ) modulo 255);
message[message_length+1] = check1;
check2 = 255 - (( sum1 + check1 ) modulo 255);
message[message_length+2] = check2;
Example 2:
(a)
register unsigned char *ptr;
register short int i, len, sum1, sum2;
sum1 = sum2 = 0;
for (i=0; i<len; i++)
{
sum1 += *ptr++;
if (sum1 >= 255) sum1 -= 255;
sum2 += sum1;
if (sum2 >= 255) sum2 -= 255;
}
(b)
moveq #0,d5
move.w d5,d4 ;sum1 = sum2 = 0;
moveq #0,d6
bra.s L_29 ;for(i=0; i<len; i++) {
L_28 moveq #0,d0
move.b (a3)+,d0
add.w d0,d4 ; sum1 += *ptr++;
cmp.w #255,d4
blt.s L_32
sub.w #255,d4 ; if(sum1 >= 255) sum1 -= 255;
L_32 add.w d4,d5 ; sum2 += sum1;
cmp.w #255,d5
blt.s L_36
sub.w #255,d5 ; if(sum2 >= 255) sum2 -= 255;
L_36 addq.w #1,d6
L_29 cmp.w d7,d6
blt.s L_28 ;}
Example 3:
(a)
register unsigned char *ptr;
register short int sum1, len;
register unsigned long int sum2;
sum1 = sum2 = 0;
while (len--)
{
sum1 += *ptr++;
if (sum1 >= 255) sum1 -= 255;
sum2 += sum1;
}
sum2 %= 255;
(b) loop moveq #0,d3
move.b (a3)+,d3
add.w d3,d0 ; sum1 += *ptr++;
cmp.w #255,d0
blt.s no sub
sub.w #255,d0 ; if (sum1 >= 255) sum1 -= 255;
no_sub add.1 d0,d1 ; sum2 += sum1;
dbra d2,loop ; while (len--);
Example 4:
; Register Usage
; D0 the first checksum value (sum1)
; D1 the second checksum value (sum2)
; D2 the length in bytes of the buffer (len)
; D4 contains zero, for the addx.b instructions
; A0 pointer into the buffer (ptr)
loop add.b (a0)+,d0 ; sum1 += *ptr++;
addx.b d4,d0 ; if (sum1 >= 256) sum1 += 1;
add.l d0,d1 ; sum2 += sum1;
dbra d2,loop ; while (len--);